Java 學習筆記 05 – 流程控制


Posted by vickyh1315 on 2024-04-16

前面例子都是以單句的宣告或賦值就完成了指令,且由上到下執行,但現實中情況的複雜得多。
流程控制的語法就是為了讓電腦知道複雜的邏輯,控制它何時該做什麼,完成指定功能的模組。

一般而言程式從上而下執行,但使用流程控制,能突破這個限制,主要透過條件判斷、迴圈循環語法來實現。

條件判斷

if/else

當滿足條件式,就執行 if 指定區段,否則執行 else 裡面區段。

if(條件式)
    敘述區段1;
else
    敘述區段2;
if(條件式) {
    敘述區段1;
    敘述區段2;
 }
 else if {
    敘述區段3;
    敘述區段4;
 } else {
    敘述區段5;
    敘述區段6;
 }

例子:讀取輸入值,判斷是整數印出數字,不是則出現警告。

public class IfStatementRunner {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("輸入一個數字:");
        if(scanner.hasNextInt()) {
            int num = scanner.nextInt();
            System.out.println("輸入整數:%d", num);
        }
        else {
            System.out.println("請輸入有效的整數!");
        }

    }
}

需要留意的是,if 的括號裡只能放 boolean,放入非 boolean 編譯會報錯。

int i = 0;
if(i) {
    System.out.println("i");
}

Compiler Error
The code snippet will result in a compiler error because the condition if(i) requires a boolean expression, but i is an integer value.

switch

switch 取出括號中的變數或運算式,與 case 中設定的數字或字元、字串比對,符合就執行裡面的敘述句,當遇到 break 就停止執行,比對到最後都沒有符合的數值或文字,就執行 default 裡面的敘述句。
需注意的是,switch 結構的變數名稱或運算式,只能是 byte、short、char、int、enum、String。

switch(變數名稱或運算式) { 
    case 常量:
        敘述區段1; 
        break; 
    case 常量: 
        敘述區段2; 
        break; 
    default: // 可省略
        敘述區段3; 
}

例子:

public class SwitchStatementRunner {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("輸入一個數字,代表星期幾:");
        int day = scanner.nextInt();
        String dayOfWeek = "";
        switch(day) {
            case 0: dayOfWeek = "Sunday"; break;
            case 1: dayOfWeek = "Monday"; break;
            case 2: dayOfWeek = "Tuesday"; break;
            case 3: dayOfWeek = "Wednesday"; break;
            default: throw new IllegalArgumentException("Invalid Option: "+day);
        }
        return dayOfWeek;
    }
}

從 Java 14 開始,融入 Lambda 表達式,提供簡化寫法,不用寫 break,就可以中斷語句。

// 改寫上述例子
public class SwitchExpressionRunner {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("輸入一個數字,代表星期幾:");
        int day = scanner.nextInt();
        String dayOfWeek = switch(day) {
            case 0 -> {
                System.out.println("Do some logic here");
                yield "Sunday";
            }
            case 1 -> "Monday";
            case 2 -> "Tuesday";
            case 3 -> "Wednesday";
            default -> throw new IllegalArgumentException("Invalid Option: "+day);
        };
        return dayOfWeek;
    }
}

迴圈循環

while / do while

while 迴圈通常用在不確定執行次數的情境,當符合條件,就會執行回圈內的程式,也因不限制執行次數,需避免發生無窮迴圈。

// a 初始化
while(條件式) { // b 迴圈條件判斷
    // c 迴圈執行程式
    // d 迭代程式
}

迴圈執行過程會是:a → b → c → d → b → c → d → ... → b
迭代程式一定要有,否則就會出現無窮迴圈情形。
結束迴圈可以透過條件式的 false (配合迭代程式)跟 break。

public class WhileRunner {
    public static void main(String[] args) {
        // a 初始化
        int sum = 0;
        int i = 1;
        while(i<100) { // b 迴圈條件判斷
            sum += i; // c 迴圈執行程式
            i++; // d 迭代程式
        }
    }
}

do while 至少執行一次迴圈,會先執行本體程式,下一次才開始判斷條件。

// a 初始化
do { 
    // c 迴圈執行程式
    // d 迭代程式
 } while(條件式); // b 迴圈條件判斷

迴圈執行過程:a → c → d → b → c → d → b → c → d → b
一樣,迭代程式一定要有。

for

for(a 初始化; b 條件式; d 迭代程式) {
    c 迴圈程式;
}

迴圈執行過程:a → b → c → d → b → c → d → ... → b
for 比起 while 不同的是,初始化部分可以宣告一個以上的變數,也支援多個變數的更新。
迴圈條件透過 false 退出迴圈。

public class ForRunner {
    public static void main(String[] args) {
        int sumI = 0;
        int sumJ = 0;
        for(int i=0, j=10; i<=10 && j<=10000; i++, j*=10) {
            sumI+=i;
            sumJ+=j;
        }
        System.out.println("sumI: " + sumI);
        System.out.println("sumJ: " + sumJ);
    }
}

for 跟 while、do while 可以混合使用,也能用巢狀的方式寫出迴圈。

break、continue、return

break

break 用在終止執行某個區塊的程式,只能寫在 switch 跟迴圈裡。

continue

continue 用在跳出區塊程式的執行,繼續下一次的循環,只能用在迴圈。

return

當方法執行到 return,這個方法將會結束,不會繼續後面的程式跟迴圈,用途不限於迴圈跟假設語句,包含整個方法。

根據結構化設計,任何程式邏輯只有一輸入與一輸出,會是從三種基本架構之一構成

  • 循序結構
  • 選擇結構
  • 重複結構

順序結構即從上到下執行的程式,沒有判斷和跳轉的情況。
分支結構會根據條件(boolean)執行指定區段的程式,if else、switch、三元運算子就屬這種分支結構。
循環結構根據有無滿足循環條件(boolean),可以重複執行區塊內程式,例如 while/do while、for。


#java







Related Posts

歡樂學 Python 位元組碼(byte code)

歡樂學 Python 位元組碼(byte code)

Secure Apache Using Certbot with Let's Encrypt on Ubuntu 20.04

Secure Apache Using Certbot with Let's Encrypt on Ubuntu 20.04

CSS 預處理器-SCSS, Sass

CSS 預處理器-SCSS, Sass


Comments